home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1994 / 7 / 02 / tips&tricks / getdrive.asm < prev    next >
Encoding:
Assembly Source File  |  1995-06-01  |  3.4 KB  |  148 lines

  1.  
  2. ; Mit dieser Routine läßt sich das Laufwerk auslesen, von dem das laufende
  3. ; Programm gestartet wurde und gleichzeitig ein neuer Pfad auf diesem Lauf-
  4. ; werk setzen. Damit ist sichergestellt, daß das Programm seine Datenfiles
  5. ; immer und überall auch findet...
  6. ; Dies geht jedoch nur bei einem Workbenchstart!
  7.  
  8. ; Am Ende des Listings ist ein Verwendungsbeispiel gegeben !!!!!!
  9.  
  10. ; "DosBase" ist der Zeiger auf die geöffnete dos.library
  11.  
  12. ;-------------------------------------------------------------------
  13. ; Startlaufwerk auslesen
  14.  
  15. ; EINGABE : a0 - Zeiger auf Verzeichnis-String (ASCII+0)
  16. ;           a1 - Message, die von der Workbench beim Programmstart
  17. ;                übergeben wird. (s.Beispiel)
  18.  
  19. ; AUSGABE : d0 - alter Disklock (long)
  20. ;           d1 - neuer Disklock (-1 = Fehler!) (long)
  21.  
  22. GetDrv:    movem.l    a2-a6/d2-d7,-(sp)        ; Register retten
  23.  
  24.     move.l    a0,-(sp)            ; Zeiger sichern
  25.  
  26.     move.l    a1,a0                ; Message von der Workbench
  27.     move.l    $24(a0),a0
  28.     move.l    (a0),d1                ; Zeiger auf Disk-Lock
  29.  
  30.     move.l    #InfoBuf,d2            ; Info über Laufwerk holen
  31.     move.l    DosBase(pc),a6
  32.     jsr    -102(a6)            ; Examine ()
  33.     tst.l    d0
  34.     beq.s    Error1                ; Fehler ?
  35.  
  36.     lea.l    InfoBuf+8(pc),a0        ; Laufwerksbezeichner auslesen
  37.  
  38.     moveq    #106,d0
  39. scrNL:    tst.b    (a0)
  40.     beq.s    cpNL
  41.     cmp.b    #":",(a0)            ; Ende des Bezeichners suchen
  42.     beq.s    cpNL
  43.     addq.l    #1,a0
  44.     dbf    d0,scrNL            ; nächstes Zeichen
  45.     bra.s    Error1                ; wenn 106 durch, dann Fehler
  46.  
  47. cpNL:    move.l    (sp)+,a1
  48.     move.b    #":",(a0)+            ; Doppelpunkt anhängen
  49. cpPfad:    move.b    (a1),(a0)+
  50.     tst.b    (a1)+                ; Endkennung ?
  51.     bne.s    cpPfad
  52.  
  53.     move.l    #InfoBuf+8,d1            ; Verzeichnis setzen
  54.     moveq    #-2,d2
  55.     move.l    DosBase(pc),a6
  56.     jsr    -84(a6)                ; Lock ()
  57.     move.l    d0,d1
  58.     beq.s    Error2
  59.     move.l    d0,-(sp)
  60.     move.l    DosBase(pc),a6
  61.     jsr    -126(a6)            ; CurrentDir ()
  62.  
  63.     ; in d0 ist jetzt der alte Lock !
  64.  
  65.     move.l    (sp)+,d1            ; neuen Lock merken
  66.  
  67.     movem.l    (sp)+,a2-a6/d2-d7        ; Register restaurieren
  68.     rts
  69.  
  70. Error1:    move.l    (sp)+,a0
  71. Error2:    movem.l    (sp)+,a2-a6/d2-d7        ; Register restaurieren
  72.     moveq    #-1,d1                ; Fehler signalisieren
  73.     rts
  74.  
  75.         cnop    0,4
  76. InfoBuf:    ds.b    $104
  77.  
  78.  
  79.  
  80. ;**********************************************************************
  81. ;**********************************************************************
  82.  
  83. Beispiel:
  84.  
  85. ;------------------------------------------
  86. ; Startup für sicheren WB und CLI Start
  87.  
  88.     movem.l    a0/d0,-(sp)            ; Kommandoparameter retten
  89.  
  90.     sub.l    a1,a1
  91.     jsr    -294(a6)            ; FindTask ()
  92.     move.l    d0,a4
  93.     tst.l    $AC(a4)
  94.     bne.s    noWB
  95.     lea.l    $5C(a4),a0
  96.     jsr    -384(a6)            ; WaitPort ()
  97.     lea.l    $5C(a4),a0
  98.     jsr    -372(a6)            ; GetMsg ()
  99.     move.l    d0,WBMsg
  100.  
  101. noWB:    movem.l    (sp)+,a0/d0
  102.     bsr.s    Prog                ; Programm aufrufen
  103.     move.l    d0,-(sp)            ; Fehlercode merken
  104.  
  105.     tst.l    WBMsg
  106.     beq.s    exit
  107.     move.l    4.w,a6                ; EXECBASE laden
  108.     jsr    -132(a6)            ; Forbid ()
  109.     move.l    WBMsg(pc),a1
  110.     jsr    -378(a6)            ; ReplyMsg ()
  111.  
  112. exit:    move.l    (sp)+,d0            ; Fehlercode zurück
  113.     rts
  114.  
  115. ;---------------------------------------
  116.  
  117. Prog:    lea.l    DosName(pc),a1
  118.     moveq    #0,d0
  119.     move.l    4.w,a6
  120.     jsr    -552(a6)            ; OpenLib ()
  121.     move.l    d0,DosBase
  122.     beq.s    Err2
  123.  
  124. LibOk:    tst.l    WBMsg                ; WorkbenchStart ?
  125.     beq.s    Main                ; nein, dann...
  126.  
  127.     lea.l    DataV(pc),a0
  128.     move.l    WBMsg(pc),a1
  129. ;---------------------------------------
  130.     bsr.w    GetDrv                ; Pfad setzen
  131. ;---------------------------------------
  132.     cmp.w    #-1,d1                ; Fehler ?
  133.     beq.s    Err1
  134.  
  135. Main:    ; **** Hier steht das eigentliche Programm... ****
  136.  
  137. Err1:    move.l    4.w,a6
  138.     move.l    DosBase(pc),a1
  139.     jsr    -414(a6)            ; CloseLib ()
  140.  
  141. Err2:    moveq    #20,d0                ; FehlerCode
  142.     rts
  143.  
  144. WBMsg:        dc.l    0
  145. DosBase:    dc.l    0
  146. DosName:    dc.b    "dos.library",0
  147. DataV:        dc.b    "DataFiles",0
  148.